import CryptoJs from 'crypto-js'

const CryptoSecret = '__CRYPTO_SECRET__'

export function enCrypto(data: any) {
  const str = JSON.stringify(data)
  return CryptoJs.AES.encrypt(str, CryptoSecret).toString()
}

export function deCrypto(data: string) {
  const bytes = CryptoJs.AES.decrypt(data, CryptoSecret)
  const str = bytes.toString(CryptoJs.enc.Utf8)

  if (str) {
    return JSON.parse(str)
  }

  return null
}

// 加密,调用该方法时，传入的data必须是字符串类型，
//   故，如果要加密对象等类型，需要先用JSON.stringify()将其字符串化再传入
export function encryptByAES(data: string, aesKey?: string) {
  let keyStr = '1Lx7yu6-CMP-Sy2f' // 16位，密钥字符串
  if (aesKey) {
    keyStr = aesKey
  }
  const key = CryptoJs.enc.Utf8.parse(keyStr) // 将字符串的转为WordArray类型
  const mydata = CryptoJs.enc.Utf8.parse(data)
  // console.log('key:', key, 'mydata:', mydata)
  const udata = CryptoJs.AES.encrypt(mydata, key, {
    mode: CryptoJs.mode.ECB, // 加密模式，ECB模式
    padding: CryptoJs.pad.Pkcs7 // 填充方式
  })
  const encrypted = udata.toString() //  返回的是base64的密文,是字符串类型
  return encrypted
}
// 解密, 调用该方法时，传入的data是base64的密文
export function decryptByAES(data: string, aesKey: string) {
  let keyStr = '1Lx7yu6-CMP-Sy2f'
  if (aesKey) {
    keyStr = aesKey
  }
  const key = CryptoJs.enc.Utf8.parse(keyStr)
  const udata = CryptoJs.AES.decrypt(data, key, {
    mode: CryptoJs.mode.ECB,
    padding: CryptoJs.pad.Pkcs7
  })
  const decrypted = udata.toString(CryptoJs.enc.Utf8) // 返回的是加密之前的原始数据,是字符串类型
  return decrypted
}
